import java.util.ArrayList;
import java.util.List;

import ar.uba.fi.algo3.titiritero.ControladorJuego;
import junit.framework.TestCase;

public class FantasmaTest extends TestCase {

	public void testBuscarPosicionAlternativa(){
		
		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
		
		List listaFantasmas = laberinto.getListaFantasmas();
		
		Blinky fantasmaBlinky = (Blinky) listaFantasmas.get(0);
	
		Punto nuevaPosicion = new Punto(5,18);
		
		fantasmaBlinky.setPosicion(nuevaPosicion);
	
		fantasmaBlinky.setDireccion(Constantes.DIRECC_ABAJO);
	
		ArrayList celdas = fantasmaBlinky.buscarPosicionAlternativa(laberinto);
	
		/*Defino las posiciones esperadas a mover por el fantasma*/
		Punto posicion1 = new Punto(6,18);
		Punto posicion2 = new Punto(5,19);
		Punto posicion3 = new Punto(5,17);
		
		/*Obtendo las celdas de la lista de posibles movimientos*/
		Celda celda1 = (Celda) celdas.get(0);
		Celda celda2 = (Celda) celdas.get(1);
		Celda celda3 = (Celda) celdas.get(2);
		 
		Punto pos1= celda1.getPosicion();
		Punto pos2= celda2.getPosicion();
		Punto pos3= celda3.getPosicion();
		
		assertEquals(posicion1,pos1);
		assertEquals(posicion2,pos2);
		assertEquals(posicion3,pos3);
	}

	public void testPosicionLejanaBlinky(){
		
		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
		
		Pacman pacman = laberinto.getPacman();
		
		Punto posicion = new Punto(20,6);
		
		pacman.setPosicion(posicion);
		
		laberinto.cambiarEstadoJuego();
		
		List listaFantasmas = laberinto.getListaFantasmas();
		
		Blinky fantasmaBlinky = (Blinky) listaFantasmas.get(0);
	    
		fantasmaBlinky.mover(laberinto);
	   
		Punto posicionEsperada = new Punto(11,14);
		assertEquals(posicionEsperada, fantasmaBlinky.getPosicion());	
	}

	public void testPosicionLejanaPinky(){
	
		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
		
		Pacman pacman = laberinto.getPacman();
		
		Punto posicion = new Punto(11,9);
		
		pacman.setPosicion(posicion);
		
		laberinto.cambiarEstadoJuego();
		
		List listaFantasmas = laberinto.getListaFantasmas();
		
		Blinky fantasmaBlinky = (Blinky) listaFantasmas.get(0);
	    
		fantasmaBlinky.mover(laberinto);
	   
		Punto posicionEsperada = new Punto(11,14);
		assertEquals(posicionEsperada, fantasmaBlinky.getPosicion());	
	}

	public void testCambiarPosicion(){
	
		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
	
		List listaFantasmas = laberinto.getListaFantasmas();
		
		Pinky fantasmaPinky = (Pinky) listaFantasmas.get(1);
		
		Punto posicion = new Punto(20,21);
		
		Punto posicionAMover = new Punto(20,22);
		
		fantasmaPinky.setPosicion(posicion);
		
		fantasmaPinky.setDireccion(1);
		
		fantasmaPinky.cambiarDireccion(posicionAMover);
	
		int direccion = fantasmaPinky.getDireccion();
		
		assertEquals(4, direccion);
	}
	
	public void testCambiarPosicionMal(){
		
		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
	
		List listaFantasmas = laberinto.getListaFantasmas();
		
		Pinky fantasmaPinky = (Pinky) listaFantasmas.get(1);
		
		Punto posicion = new Punto(20,21);
		
		Punto posicionAMover = new Punto(20,22);
		
		fantasmaPinky.setPosicion(posicion);
		
		fantasmaPinky.setDireccion(1);
		
		fantasmaPinky.cambiarDireccion(posicionAMover);
	
		int direccion = fantasmaPinky.getDireccion();

		int dire = 3;
		
		assertEquals(false, dire == direccion);
	}

	public void testInvertirDireccion(){

		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
	
		List listaFantasmas = laberinto.getListaFantasmas();
		
		Pinky fantasmaPinky = (Pinky) listaFantasmas.get(1);
						
		fantasmaPinky.setDireccion(Constantes.DIRECC_ARRIBA);
		
		fantasmaPinky.invertirDireccion();
		
		int direccion = fantasmaPinky.getDireccion();
		
		int dire = Constantes.DIRECC_ABAJO;
		assertEquals(true, dire == direccion);
	}	

	public void testInvertirDireccionMal(){

		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
	
		List listaFantasmas = laberinto.getListaFantasmas();
		
		Pinky fantasmaPinky = (Pinky) listaFantasmas.get(1);
		
		int direccion = fantasmaPinky.getDireccion();
		
		fantasmaPinky.invertirDireccion();
	
		int dire = 4;
		
		assertEquals(false, dire == direccion);
	}
	
	public void testReaccionSerComidoPorPacman(){
		
		ControladorJuego controlador = new ControladorJuego();
		Laberinto laberinto = LaberintoFactory.crearLaberinto(controlador);
		
		Pacman pacman = laberinto.getPacman();
		
		Punto posicion1 = new Punto(5,6);
		
		pacman.setPosicion(posicion1);

		List listaFantasmas = laberinto.getListaFantasmas();
		
		Blinky fantasmaBlinky = (Blinky) listaFantasmas.get(0);
	    
		Punto posicion2 = new Punto(5,6);
		
		fantasmaBlinky.setPosicion(posicion2);
		
		laberinto.cambiarEstadoJuego();		
		
		fantasmaBlinky.reaccion(laberinto);
				
		Blinky fantasmaBlinky2 = (Blinky) listaFantasmas.get(0);
	
		Punto posicionEsperada = new Punto(11,13);
		
		Punto posicionBlinky = fantasmaBlinky2.getPosicion();
		
		assertEquals(posicionEsperada,posicionBlinky);
	}

}
	
	